
02.06.2009, 18:39
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Как "подождать" выполнение асинхронного запроса?
function hasChildren(id) {
var dicHasChildren = false;
jQuery.post(url,
{"sydicId": id},
function(resp) {
dicHasChildren = resp;
});
return dicHasChildren;
}
function confirmDelete(obj, link) {
var msg = "Вы действительно хотите удалить словарь?";
if (hasChildren(sydicId))
msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
var ans = confirm(msg);
....
Суть в следующем. Функция confirmDelete запрашивает подтверждение при удалении словаря. Функция hasChildren проверяет, не содержит ли словарь подсловари, c помощью ajax-запроса, и если содержит, то текст предупреждения должен измениться.
Проблема в том, что функция hasChildren возвращает значение не дожидаясь выполнения callback-функции, которая передается в jQuery.post и соответственно возвращаемое значение всегда остается одинаковым. Как заставить функцию hasChildren подождать выполнения запроса к серверу?
|
|

02.06.2009, 19:06
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Так раз вы понимаете, что запрос асинхронный, значит нужно выполнять не синхронно, не пытаться сделать так, чтобы можно было подождать, а с помощью callback-функции:
function confirmDelete(obj, link) {
var msg = "Вы действительно хотите удалить словарь?";
var dicHasChildren = false;
jQuery.post(url, {"sydicId": id}, function(resp) {
dicHasChildren = resp;
if (dicHasChildren) {
msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
var ans = confirm(msg);
}
});
}
|
|

03.06.2009, 15:19
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Я первоначально так и делал. Сейчас понял, что происходило.
function confirmDelete(obj, link) {
var msg = "Вы действительно хотите удалить словарь?";
var ans;
jQuery.post( url,
{"sydicId": sydicId},
function(resp) {
if (resp) {
msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
}
ans = confirm(msg);
});
alert(ans); //выводит раньше чем выполнилась callback-функция
return ans ? true : false;
}
Если убрать алерт перед return, то возврат из функции будет происходить раньше, чем появилось окно confirm. То есть функция всегда возвращала false(или undefined, что равнозначно).
alert притормаживает выполнение функции, и ajax успевает отработать.
То есть я сейчас вижу только один выход - поставить перед return таймаут с каким-то фиктивным действием, чтобы не дать функции confirmDelete завершиться, прежде чем появится окно confirm.
|
|

03.06.2009, 15:21
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
По-моему, вы не понимаете самого принципа асинхронности.
|
|

03.06.2009, 16:18
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Принцип асинхронности в данном случае проявляется в том, что пока идет запрос к серверу скрипт выполняется дальше. А выполнить возврат из функции confirmDelete в callback-функции я не смогу(научите, если знаете как).
|
|

03.06.2009, 16:20
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Если вы хотите получить какие-то данные от асинхронной функции, то нужно передавать ей callback.
function confirmDelete(obj, link, callback) // вместо return result; будет callback(result);
|
|

03.06.2009, 17:08
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Не совсем понял синтаксис.
function confirmDelete(obj, link, onAjaxSuccess) {
var msg = "Вы действительно хотите удалить словарь?";
var ans;
jQuery.post( url,
{"sydicId": sydicId},
onAjaxSuccess);
return onAjaxSuccess(ans) ? true : false;
}
function onAjaxSuccess(resp) {
if (resp) {
msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
}
ans = confirm(msg);
}
? onAjaxSuccess not a function
В строке с return.
|
|

03.06.2009, 17:10
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Мне нужно получить то, что приходит в параметре resp.
|
|

03.06.2009, 17:20
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
function confirmDelete(obj, link, callback) {
$.post(url, {}, callback);
}
confirmDelete({}, 'link', function() {
alert('Удалили');
});
|
|

03.06.2009, 17:44
|
Аспирант
|
|
Регистрация: 10.05.2009
Сообщений: 57
|
|
Вызов confirmDelete
onClick="return confirmDelete('syDictionary', this, onAjaxSuccess);"
Скрипт
function confirmDelete(obj, link, callback) {
var msg = "Вы действительно хотите удалить словарь?";
var ans;
jQuery.post( url,
{"sydicId": sydicId},
callback);
return /*что здесь?*/ ? true : false;
}
function onAjaxSuccess(resp) {
if (resp) {
msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
}
ans = confirm(msg);
}
Вот тут
return /*что здесь?*/ ? true : false;
у меня в условии должно оказаться значение которое вернул confirm в callback-функции. Как это сделать?
Последний раз редактировалось WalterScott, 03.06.2009 в 17:46.
|
|
|
|